home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 9 / FM Towns Free Software Collection 9.iso / taropyon / silib / prg / sdkmenu / sdkmenu.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-11-16  |  12.5 KB  |  528 lines

  1. /*************************************************************************
  2. *    SIDEWORK MENU
  3. *************************************************************************/
  4.  
  5. #include    <stdio.h>
  6. #include    <stdlib.h>
  7. #include    <string.h>
  8. #include    <ctype.h>
  9. #include    <msdos.cf>
  10.  
  11. #include    <egb.h>
  12. #include    <mos.h>
  13. #include    <kkstr2.h>
  14. #include    <sidework.h>
  15.  
  16. #include    <siapl.h>
  17. #include    <silib.h>
  18. #include    <sisdk.h>
  19. #include    <SDK/blkdlg.h>
  20. #include    <sifs.h>
  21. #include    <kbcode.h>
  22. #include    "sdkmenu.h"
  23.  
  24. #define    TITLE_DLG    "SIDEWORK MENU"
  25.  
  26. #define    SBATT    (SB_ATT_VERTICAL | SB_ATT_MAXADJUST | SB_ATT_DRAGSLD | SB_ATT_BTNREP)
  27.  
  28. #define    NUMDSPMAX    (14)    /* 表示数                        */
  29. #define    YSMENU        (14)    /* 項目の縦ドット数(14 or 16)    */
  30.  
  31. #if    YSMENU == 16
  32. #    define    _KEY_FTS    (SiFts->ftsSt1)
  33. #    define    _MSG_FTS    (SiFts->ftsSs1)
  34. #endif
  35. #if    YSMENU == 14
  36. #    define    _KEY_FTS    (SiFts->ftsSh1)
  37. #    define    _MSG_FTS    (SiFts->ftsSs1)
  38. #endif
  39.  
  40. int        evNoCancel;
  41. int        evNoCurup;
  42. int        evNoCurdown;
  43. int        evNoExec;
  44. #define    SDKEV_CANCEL    (evNoCancel)
  45. #define    SDKEV_EXIT        SDKEV_CANCEL
  46. #define    SDKEV_CURUP        (evNoCurup)
  47. #define    SDKEV_CURDOWN    (evNoCurdown)
  48. #define    SDKEV_EXEC        (evNoExec)
  49.  
  50. extern int        sdk_exec(int);
  51. extern int        sdk_getNumProg(void);
  52. extern int        sdk_getProgNameLen(int);
  53. extern int        sdk_getProgName(int,char *,char *);
  54. extern int        sdk_isExist(void);
  55.  
  56. char            *SkeyTbl;
  57.  
  58. int        SdkExec( int no )
  59. {
  60.     int        ret;
  61.  
  62.     if ( sdk_isAtWork() )
  63.     {    /* サイドワーク起動中    */
  64.         sdk_chain( no + 1);
  65.     } else
  66.     {    /* 通常アプリケーション    */
  67.         ret = sdk_exec( no + 1);
  68.         sdk_control(0);
  69.     }
  70.     return (ret);
  71. }
  72.  
  73. /*************************************************************************
  74. *    プログラム名の表示
  75. *************************************************************************/
  76.  
  77. void    sdkdsp_prog( SDKDLG_T *sdkDlg, int pos )
  78. {
  79.     int            i;
  80.     int            x1 = sdkDlg->frScn.x1;
  81.     int            x2 = sdkDlg->frScn.x2;
  82.     LAYER_T        *ly = SiScn->layerCrt;
  83.  
  84.     if ( sdkDlg->sb )
  85.     {    /* スクロールバー設定    ----------------------------------------*/
  86.         SB_T    *sb = sdkDlg->sb;
  87.  
  88.         sb->top   = sdkDlg->posDspTop;
  89.     }
  90.  
  91.     MOS_DEC();
  92.     for ( i = 0; i < sdkDlg->numDsp; ++i )
  93.     {
  94.         int        p;
  95.  
  96.         p = sdkDlg->posDspTop + i;
  97.         if ( pos < 0 || pos == p )
  98.         {
  99.             int        y;
  100.  
  101.             y = sdkDlg->frScn.y1 + 2 + i*YSMENU;
  102.             if ( sdkDlg->posDspTop + i < sdkDlg->numProg )
  103.             {
  104.                 COLOR_T        col, bac, c1, c2, strcol;
  105.                 int            xx1, yy1, xx2, yy2;
  106.  
  107.                 if ( sdkDlg->posSel != i )
  108.                 {
  109.                     col = ly->col.black;
  110.                     bac = ly->col.gray;
  111.                     c1  = ly->col.lgray;
  112.                     c2  = ly->col.dark;
  113.                     strcol = ly->col.black;
  114.                 } else
  115.                 {
  116.                     col = ly->col.gray;
  117.                     bac = ly->col.black;
  118.                     c1  = ly->col.dark;
  119.                     c2  = ly->col.lgray;
  120.                     strcol = ly->colTbl[8+2];
  121.                 }
  122.  
  123.                 xx1 = x1 + 2 + 8 + 2;
  124.                 yy1 = y;
  125.                 xx2 = x2 - 2;
  126.                 yy2 = y + YSMENU - 1;
  127.  
  128.                 {
  129.                     char    tmp[128], key[2];
  130.  
  131.                     sdk_getProgName( p+1, tmp, key );
  132.                     key[1] = '\0';
  133.                     if ( !SkeyTbl[p] )
  134.                         strcol = ly->col.gray;
  135.                     SCN_BOXF(x1+2,yy1,xx1-1,yy2,PSET,ly->col.white);
  136. #if    YSMENU == 14
  137.                     SCN_PUTS(_KEY_FTS,key,x1+2+1,y+(YSMENU-_KEY_FTS->fntYs+2)/2+1,OPAQUE,ly->col.lgray,ly->col.white);
  138.                     SCN_PUTS(_KEY_FTS,key,x1+2  ,y+(YSMENU-_KEY_FTS->fntYs+2)/2  ,PSET  ,strcol       ,ly->col.white);
  139. #else
  140.                     SCN_PUTS(_KEY_FTS,key,x1+2+1,y+(YSMENU-_KEY_FTS->fntYs+1)/2+1,OPAQUE,ly->col.lgay ,ly->col.white);
  141.                     SCN_PUTS(_KEY_FTS,key,x1+2  ,y+(YSMENU-_KEY_FTS->fntYs+1)/2  ,PSET  ,strcol       ,ly->col.white);
  142. #endif
  143.                     SCN_BOXFCON(xx1,yy1,xx2,yy2,1,PSET,bac,c1,c2);
  144.                     {
  145.                         int        xs, ys;
  146.  
  147.                         FTS_chkPutSize( _MSG_FTS, &xs, &ys, tmp );
  148.                         SCN_PUTS(_MSG_FTS,tmp,(xx1+2+xx2-2-xs+1)/2,(yy1+yy2+1-ys)/2,OPAQUE,col,bac);
  149.                     }
  150.                 }
  151.  
  152.                 if ( pos < 0 )
  153.                 {
  154.                     EV_SETBTN1(sdkDlg->evDsp, i, p, sdkDlg, 0,
  155.                         NULL, EVSW_LEFT,xx1,yy1,xx2,yy2,1,c1,c2);
  156.                 }
  157.             } else
  158.             {
  159.                 SCN_BOXF(x1+1,y,x2-1,y+15,PSET,ly->col.white);
  160.                 if ( pos < 0 )
  161.                     EV_datUnset( sdkDlg->evDsp, i);
  162.             }
  163.  
  164.             if ( pos == p )
  165.                 break;
  166.         }
  167.     }
  168.     MOS_INC();
  169. }
  170.  
  171. static int        sdkEvFunc_cursor( int evNo, EVDAT_T *evdat )
  172. {
  173.     SDKDLG_T    *sdkDlg = evdat->ptr;
  174.  
  175.     if ( evNo  == SDKEV_CURUP )
  176.     {
  177.         if ( sdkDlg->posSel < 0 )
  178.         {
  179.             sdkDlg->posSel = sdkDlg->numDsp - 1;
  180.             sdkdsp_prog( sdkDlg, sdkDlg->posDspTop + sdkDlg->posSel );
  181.         } else
  182.         {    if ( sdkDlg->posSel == 0 && sdkDlg->posDspTop > 0 )
  183.             {
  184.                 --sdkDlg->posDspTop;
  185.                 sdkdsp_prog( sdkDlg, -1 );
  186.                 if ( sdkDlg->sb )
  187.                     SB_vUpdate( sdkDlg->sb );
  188.             } else if ( sdkDlg->posSel > 0 )
  189.             {
  190.                 sdkdsp_prog( sdkDlg, sdkDlg->posDspTop + (sdkDlg->posSel--) );
  191.                 sdkdsp_prog( sdkDlg, sdkDlg->posDspTop + sdkDlg->posSel );
  192.             }
  193.         }
  194.     } else if ( evNo == SDKEV_CURDOWN )
  195.     {
  196.         if ( sdkDlg->posSel < 0 )
  197.         {
  198.             sdkDlg->posSel = 0;
  199.             sdkdsp_prog( sdkDlg, sdkDlg->posDspTop );
  200.         } else
  201.         {    if ( sdkDlg->posSel == sdkDlg->numDsp - 1 && sdkDlg->posDspTop < sdkDlg->numProg - sdkDlg->numDsp )
  202.             {
  203.                 ++sdkDlg->posDspTop;
  204.                 sdkdsp_prog( sdkDlg, -1 );
  205.                 if ( sdkDlg->sb )
  206.                     SB_vUpdate( sdkDlg->sb );
  207.             } else if ( sdkDlg->posSel <  sdkDlg->numDsp - 1 )
  208.             {
  209.                 sdkdsp_prog( sdkDlg, sdkDlg->posDspTop + (sdkDlg->posSel++) );
  210.                 sdkdsp_prog( sdkDlg, sdkDlg->posDspTop + sdkDlg->posSel );
  211.             }
  212.         }
  213.     } else if ( evNo == SDKEV_EXEC )
  214.     {
  215.         if ( sdkDlg->posSel >= 0 )
  216.             return (sdkDlg->posDspTop + sdkDlg->posSel);
  217.     }
  218.     return (EV_BREAK);
  219. }
  220.  
  221. static int        sdkFunc_sbar( int evNo, SB_T *sb )
  222. {
  223.     SDKDLG_T    *sdkDlg = sb->ptr;
  224.  
  225.     if ( sdkDlg->posDspTop == sb->top )
  226.         return (EV_NOTHING);
  227.     sdkDlg->posDspTop = sb->top;
  228.     sdkdsp_prog( sdkDlg, -1 );
  229.     return (EV_NOTHING);
  230. }
  231.  
  232. void    sdkFunc_dlgdsp( BLKDLG_T *dlg )
  233. {
  234.     SDKDLG_T        *sdkDlg = dlg->ptr;
  235.     int                x1 = dlg->rect.x0 + 2;
  236.     int                y1 = dlg->rect.y0 + 2;
  237.     int                x2 = dlg->rect.x0 + dlg->rect.xs - 1 - 2;
  238.     int                y2 = dlg->rect.y0 + dlg->rect.ys - 1 - 2;
  239.     EV_T            *ev = sdkDlg->ev;
  240.     int                evPos = 0;
  241.     void            *win = NULL;
  242.     LAYER_T            *ly = SiScn->layerCrt;
  243.     CONST COLOR_T    sha = ly->col.dark, hil = ly->col.white;
  244.  
  245.     sdkDlg->fr.x1 = x1;
  246.     sdkDlg->fr.y1 = y1;
  247.     sdkDlg->fr.x2 = x2;
  248.     sdkDlg->fr.y2 = y2;
  249.  
  250.     /* クローズボタン    ------------------------------------------------*/
  251.     {
  252.         CONST int    xx1 = x1   , yy1 = y1;
  253.         CONST int    xx2 = x1+15, yy2 = y1+15;
  254.  
  255.         SCN_PUTIMGPTN( &Ptn16x16_close, xx1, yy1, OPAQUE, ly->col.black,ly->col.gray);
  256.         SCN_BOXCON(xx1,yy1,xx2,yy2,1,PSET,hil, sha);
  257.         EV_SETBTN1(ev,evPos++, SDKEV_EXIT, sdkDlg, 0,
  258.             win, EVSW_LEFT,xx1,yy1,xx2,yy2,1,hil,sha);
  259.     }
  260.  
  261.     /* タイトル    --------------------------------------------------------*/
  262.     {
  263.         CONST int    xx1 = x1 + 16, yy1 = y1;
  264.         CONST int    xx2 = x2     , yy2 = y1 + 15;
  265.         static CONST char    *title = TITLE_DLG;
  266.  
  267.         SCN_BOXFCON(xx1,yy1,xx2,yy2,1,PSET,ly->col.gray,hil,sha);
  268.         EV_SETFR(ev,evPos++, 0, dlg,BlkDlgMoveEvFunc,win,EVSW_LEFT,
  269.           xx1, yy1, xx2, yy2);
  270.         SCN_PUTS(SiFts->ftsSs2,title,xx1+3,yy1+3,OPAQUE,ly->col.white,ly->col.gray);
  271.         SCN_PUTS(SiFts->ftsSs2,title,xx1+2,yy1+2,PSET  ,ly->col.black,ly->col.gray);
  272.     }
  273.  
  274.     {    /* プログラム一覧表示    ----------------------------------------*/
  275.         CONST int        xx1 = x1 + 2;
  276.         CONST int        yy1 = y1 + 16 + 2;
  277.         CONST int        xx2 = x1 + 2 + sdkDlg->xsDsp - 1;
  278.         CONST int        yy2 = yy1 + (2+YSMENU*sdkDlg->numDsp+2) -1;
  279.  
  280.         sdkDlg->frScn.x1 = xx1;
  281.         sdkDlg->frScn.y1 = yy1;
  282.         sdkDlg->frScn.x2 = xx2;
  283.         sdkDlg->frScn.y2 = yy2;
  284.  
  285.         SCN_BOXFCON(xx1,yy1,xx2,yy2,1,PSET,ly->col.white,ly->col.dark,ly->col.gray);
  286.     }
  287.  
  288.     if ( sdkDlg->sb )
  289.     {    /* スクロールバー    --------------------------------------------*/
  290.         SB_T    *sb = sdkDlg->sb;
  291.         FRAME_T    fr;
  292.  
  293.         fr.x1 = sdkDlg->frScn.x2 + 2;
  294.         fr.y1 = sdkDlg->frScn.y1;
  295.         fr.x2 = x2 - 2;
  296.         fr.y2 = sdkDlg->frScn.y2;
  297.         SB_vDsp( sb, &fr );
  298.     }
  299.  
  300.     /* プログラム一覧の表示    --------------------------------------------*/
  301.     sdkdsp_prog( sdkDlg, -1 );
  302.  
  303.     /* カーソルキー用イベント    ----------------------------------------*/
  304.     EV_SETKON1( ev,evPos++, SDKEV_CURUP  ,sdkDlg,sdkEvFunc_cursor, win,0xFFFF,KA_UP   );
  305.     EV_SETKON1( ev,evPos++, SDKEV_CURDOWN,sdkDlg,sdkEvFunc_cursor, win,0xFFFF,KA_DOWN );
  306.     EV_SETKON1( ev,evPos++, SDKEV_EXEC   ,sdkDlg,sdkEvFunc_cursor, win,'\r'  ,KA_EXEC );
  307.  
  308.     /* キャンセル用イベント    --------------------------------------------*/
  309.     EV_SETSWOLY(ev,evPos++,SDKEV_CANCEL,NULL,0,win,     0,EVSW_RIGHT);
  310.     EV_SETKON1( ev,evPos++,SDKEV_CANCEL,NULL,0,win,'\x1B',KA_CANCEL );
  311. }
  312.  
  313. int        SdkMenu(void)
  314. {
  315.     int            ret;
  316.     SDKDLG_T    _sdkDlg, *sdkDlg = &_sdkDlg;
  317.  
  318.     memset( sdkDlg, 0, sizeof(SDKDLG_T));
  319.     sdkDlg->posSel = -1;
  320.  
  321.     void    term(void)
  322.     {
  323.         if ( sdkDlg->dlg )        BLKDLG_close( sdkDlg->dlg );
  324.         if ( sdkDlg->ev )        EV_workFree(sdkDlg->ev);
  325.         if ( sdkDlg->evDsp )    EV_workFree(sdkDlg->evDsp);
  326.         if ( sdkDlg->evKey )    EV_workFree(sdkDlg->evKey);
  327.         if ( sdkDlg->sb )        SB_close(sdkDlg->sb);
  328.     };
  329.  
  330.     sdkDlg->numProg = sdkDlg->numDsp = sdk_getNumProg() - 1;
  331.     if ( sdkDlg->numDsp > NUMDSPMAX )
  332.     {
  333.         sdkDlg->numDsp = NUMDSPMAX;
  334.         sdkDlg->flgSb  = TRUE;    /* スクロールバーを使用    */
  335.     }
  336.  
  337.     if ( sdk_isExist() == 0 || sdkDlg->numProg <= 0 )
  338.         return (ERR);
  339.  
  340.     sdkDlg->dlg   = BLKDLG_open( sdkFunc_dlgdsp, sdkDlg );
  341.     sdkDlg->ev    = EV_workAlloc(NULL,8);
  342.     sdkDlg->evDsp = EV_workAlloc(sdkDlg->ev,sdkDlg->numDsp );
  343.     sdkDlg->evKey = EV_workAlloc(sdkDlg->ev,sdkDlg->numProg);
  344.     if ( sdkDlg->flgSb )
  345.     {
  346.         sdkDlg->sb = SB_open( SBATT, NULL, sdkFunc_sbar, sdkDlg );
  347.         SB_ev_workAlloc( sdkDlg->sb, sdkDlg->ev);
  348.     }
  349.     if ( !(sdkDlg->dlg) || !(sdkDlg->ev)
  350.       || !(sdkDlg->evDsp) || !(sdkDlg->evKey)
  351.       || (sdkDlg->flgSb && !(sdkDlg->sb)) )
  352.     {
  353.         term();    return (ERR);
  354.     }
  355.  
  356.     if ( sdkDlg->sb )
  357.     {    /* スクロールバー設定    ----------------------------------------*/
  358.         SB_T    *sb = sdkDlg->sb;
  359.  
  360.         sb->total = sdkDlg->numProg;
  361.         sb->min   = 0;
  362.         sb->max   = sdkDlg->numProg - 1;
  363.         sb->top   = sdkDlg->posDspTop;
  364.         sb->wid   = sdkDlg->numDsp;
  365.     }
  366.  
  367.     {    /* ダイアログの大きさを求める    */
  368.         int        i, max = 0;
  369.  
  370.         sdkDlg->ys = 2 + (16 + 2 + (2+YSMENU*sdkDlg->numDsp+2) + 2) +2;
  371.         for ( i = 0; i < sdkDlg->numProg; ++i )
  372.         {
  373.             int        len;
  374.  
  375.             len = sdk_getProgNameLen(i+1);
  376.             if ( len > max )
  377.                 max = len;
  378.         }
  379.         sdkDlg->xsDsp = 2+8+2 + 2+max*6+2 + 2;
  380.         sdkDlg->xs    = 4 + sdkDlg->xsDsp + 4;
  381.         if ( sdkDlg->flgSb )
  382.             sdkDlg->xs += (16);
  383.  
  384.         BLKDLG_setSize( sdkDlg->dlg, sdkDlg->xs, sdkDlg->ys );
  385.     }
  386.  
  387.     {    /* 表示位置の設定    */
  388.         int    x, y;
  389.  
  390.         PD_getp(&x,&y);
  391.         sdkDlg->dlg->rect.x0 = x - sdkDlg->dlg->rect.xs/2;
  392.         sdkDlg->dlg->rect.y0 = y - sdkDlg->dlg->rect.ys/2;
  393.         BLKDLG_chkpos( sdkDlg->dlg );
  394.     }
  395.  
  396.     /* イベント番号の設定    --------------------------------------------*/
  397.     {
  398.         int        i;
  399.  
  400.         evNoCancel     = sdkDlg->numProg + 1;
  401.         evNoCurup      = sdkDlg->numProg + 2;
  402.         evNoCurdown    = sdkDlg->numProg + 3;
  403.         evNoExec       = sdkDlg->numProg + 4;
  404.  
  405.         if ( (SkeyTbl = SI_CALLOC(sdkDlg->numProg, sizeof(char))) == NULL )
  406.         {
  407.             term();    return (ERR);
  408.         }
  409.  
  410.         for ( i = 0; i < sdkDlg->numProg; ++i )
  411.         {
  412.             char    key, tmp[128];
  413.  
  414.             sdk_getProgName( i+1, tmp, &key );
  415.             if ( i > 0 )
  416.             {
  417.                 int        j;
  418.  
  419.                 for ( j = 0; j < i; ++j )
  420.                 {
  421.                     if ( key == (UCHAR)SkeyTbl[j] )
  422.                     {
  423.                         key = 0;
  424.                         break;
  425.                     }
  426.                 }
  427.             }
  428.             if ( key )
  429.             {
  430.                 SkeyTbl[i] = key;
  431.                 EV_SETKON1(sdkDlg->evKey,i,i, sdkDlg,0, NULL,
  432.                     (UCHAR)SkeyTbl[i], KbEcTbl[(UCHAR)SkeyTbl[i]]);
  433.             }
  434.         }
  435.     }
  436.  
  437.     if ( BLKDLG_dsp(sdkDlg->dlg) == NORMAL )
  438.     {
  439.         for(;;)
  440.         {
  441.             MOS_CON();
  442.             if ( (ret = EV_chk(sdkDlg->ev,0)) >= 0 )
  443.                 break;
  444.         }
  445.     } else
  446.         ret = ERR;
  447.  
  448.     term();
  449.     if ( ret >= 0 && ret < sdkDlg->numProg )
  450.         ret = SdkExec( ret );
  451.     else
  452.         ret = ERR;
  453.     return (ret);
  454. }
  455.  
  456.  
  457. static char        set24 = FALSE;
  458.  
  459. static int    init(void)
  460. {
  461.     int        scnmd = 0x0303, pageMos = 0, pageKb = 0;
  462.  
  463.     if ( SDK_init() )
  464.         return (ERR);
  465.     SI_init();
  466.  
  467.     KB_initSet(pageKb,KAN_ROUMAZIOFF);
  468.     if ( SCN_init(scnmd) )
  469.         return (ERR);
  470.     switch ( SiScn->layerCrt->pixel )
  471.     {
  472.         case 4:
  473.             C_LGRAY  = 5;
  474.             C_MBLACK = 1;
  475.             break;
  476.  
  477.         case 8:
  478.             C_LGRAY  = 17;
  479.             C_MBLACK =  0;
  480.             break;
  481.     }
  482.     SCN_setSysPalette();
  483.     pageMos = SiScn->pgWrt;
  484.     if ( FlgSdkOn )
  485.         pageKb = pageMos = SiScn->pgWrt;
  486.     else
  487.     {
  488.         SI_set24h();
  489.         SI_setCtrlC();
  490.         set24 = TRUE;
  491.     }
  492.  
  493.     FTS_init();
  494.     PD_init(0,pageMos);    /* ポインティングデバイスライブラリ    */
  495.     KB_init(pageKb,0);    /* キーボードライブラリ                */
  496.     KB_kanDsp(0);
  497.     EV_init();            /* イベントライブラリ                */
  498.  
  499.     return (NORMAL);
  500. }
  501.  
  502. static void term(void)
  503. {
  504.     if ( set24 )
  505.         SI_reset24h();
  506.     EV_term();
  507.     PD_term();
  508.     KB_term();
  509.     FTS_term();
  510.     SCN_sysTerm();
  511.     SI_term();
  512.     SDK_term();
  513. }
  514.  
  515. int        main(int argc, char **argv)
  516. {
  517.     int            ret = 1;
  518.  
  519.     if ( init() )
  520.         goto _RET;
  521.  
  522.     SdkMenu();
  523.  
  524. _RET:
  525.     term();
  526.     return (ret);
  527. }
  528.